<?php

namespace core;

use core\lib\Log;
use core\lib\Route;

class Core
{
    protected static $systemActions = array( // 存放系统动作表
        'beforeAction'
    );

    // 程序的入口
    public static function run()
    {
        Log::init(); // 初始化加载日志系统
        new Route(); // 初始化请求路由对象
        $controller = ucfirst(Route::$controller); // 控制器
        $action = Route::$action; // 动作

        if (in_array($action, self::$systemActions)) { // 禁止请求系统内置动作
            throw new \Exception('找不到' . $action . '动作');
        }

        // 加载控制器文件
        $ctrl_file = APP . '/' . MODULE . '/protected/controller/' . $controller . 'Controller.php';
        if (is_file($ctrl_file)) {
            include $ctrl_file;
            $obj = "\app\controller\\" . $controller . 'Controller';
            $controllerObj = new $obj();
            if ($controllerObj->beforeAction()) { // 运行控制器前置动作
                $controllerObj->$action(); // 运行请求动作
            }
            // 记录请求
            Log::log(array('action' => $action, 'controller' => $controller . 'Controller'));
        } else {
            throw new \Exception('找不到该控制器' . $controller . 'Controller');
        }
    }

    /*自动加载类库*/
    static public function load($class)
    {
        $class = str_replace('\\', '/', $class);
        $pathArr = explode('/', $class);
        if (!empty($pathArr) && $pathArr[0] && $pathArr[0] == MODULE) { // 应用文件下的类命名空间必须以文件夹名称空间下
            $file = APP . '/' . str_replace(MODULE . '/', MODULE . '/protected/', $class) . '.php'; // 引入应用下的类
        } else {
            $file = ROOT . '/' . $class . '.php'; // 引入框架中的公共类
        }
        if (is_file($file)) {
            include $file;
        } else {
            return false;
        };
    }


}